shell 之rm 命令的替换方案 您所在的位置:网站首页 linux 替代rm shell 之rm 命令的替换方案

shell 之rm 命令的替换方案

2024-04-25 04:37| 来源: 网络整理| 查看: 265

在日常工作中经常避免要删除一些暂时不需要的文件,但由于内心着急、操作太快导致把线上的文重要件给删了,会给公司照成一些不必要的损失(最主要的是今年的年终奖又没了!!)

由于最近这个问题又在身边发生了;接下来我描述下事情发生过程:

       周五临近下班前,问小弟今天的数据恢复有没有做(例行检查备份数据是否有异常)。经我这么一问他才想起工作没有做……

        存放备份的目录是/back ,他把备份的文件解压到/back目录下,并且解压出来的目录也叫back ,最终备份的数据应该在/back/back/备份数据,为了确保解压的数据没有污染,需要吧/back/back目录删掉。

        他计划是这样操作的:为了防止误操作,先进到/back目录中,然后执行命令:  # rm -rf back就可以了,但是他习惯从根目录找,而且还把上级目录名当成当前目录下的目录名,结果把命令写成: # rm -rf /back ,导致/back下的其他的数据也被删掉了……可能是由于忙于下班,执行删除操作没有仔细确认命令导致数据丢失。不过最后庆幸的是把数据恢复回来了!(数据陈可贵,操作需谨慎!)

        由于已经发生过2次与删除事件,为了防止该类事件再次发生,开始本打算在网上找一下有没有现成的,最后发现功能都很简单,故这周末在家花了一天时间写了一个替换rm的命令(原rm命令也可以用,需要指定绝对路径:/bin/rm)

以下为rm命令的代码,请在测试环境测试完再放到线上使用!如发生后果请自负!

#!/bin/bash

### 重定义rm命令 ###

# 定义回收站目录#trash_path=\~/.trash#confidir="~/tmp"STAMP=`date +%Y%m%d%H%M%S`

# 判断 $trash_path 定义的文件是否存在,如果不存在,那么就创建 $trash_path.if [ ! -d ~/.trash ]; then    mkdir -p ~/.trash fi

if [ ! -d ~/tmp ]; then    mkdir -p ~/tmpfi# 使用 rl 就调用 'ls ~/.trash' # 如果更改上面的回收站目录这里的目录也需要修改

#用法提示usage() {  echo "Usage:"  echo "  rm {-d delele } {-c all } {-l } {-s [ all | file ] }"  echo "Description:"  echo " -d  delete, 删除目录或目录."  echo " -c  clean, 清空回收站或永久删除某个文件."  echo " -l  list, 列出已删除的文件"  echo " -s  save, 恢复单个或所以已删除文件."  echo "注意!不支持这样的写法: /aa/bb/cc/{a,b,c}"  echo "注意!支持这样的写法: /aa/bb/cc/a /aa/bb/cc/b /aa/bb/cc/c"  exit -1}

list() {  echo "以下为回收站的文件"  ls ~/.trash}

save() {  echo "如果有重复的文件请指定文件名并恢复"  read -p "确定要恢复所有文件到~/tmp下吗?[y/n y] " confirm  for i in `ls ~/.trash/`;do    mv -i ~/.trash/$i  ~/tmp/${i%.*}    done  exit -1}

clean() {  read -p "回收站会保留一个月,确定要清空回收站的文件吗?[y/n n]" confirm  [ $confirm == y ] || [ $confirm == Y ] || [ $confirm == yes ] && /bin/rm -rf  ~/.trash/*  exit -1

}

# 获取脚本执行时的选项while getopts :d:c:s:l option  do  case "${option}"  in      d)       # 删除文件的函数      read -p "如果文件很大删除需要一些时间,请不要终止操作,否则恢复的文件将无法使用!![y/n y]" conf      if [[ "$conf" == "y" ]] || [[ "$conf" = "Y" ]] || [[ "$conf" = "yes" ]] || [ ! $conf ];then         shift        nameall=$(echo $@)        read -p "$nameall 您确定要删除这个文件或目录吗?[y/n n] " confisv        for i in $@;do          #name=`echo $(basename $i)`          name=$(echo $i| awk -F/ '{print $NF}')          #[[ $confisv = "y" ]] || [[ $confisv = "Y" ]] || [[ $confisv = "yes" ]]  && mv ${OPTARG}  ~/.trash/${OPTARG}.$STAMP          [[ $confisv = "y" ]] || [[ $confisv = "Y" ]] || [[ $confisv = "yes" ]]  && mv $i  ~/.trash/$name\.$STAMP        done        exit -1      else        break        exit -1      fi    ;;    c)        list       if [[ ${OPTARG} -eq "all" ]];then         clean       else         read -p "确定要删除回收站的这个 ${OPTARG} 文件吗?[y/n n]" confirm         [[ $confirm == "y" ]] || [[ $confirm == "Y" ]] || [[ $confirm == "yes" ]] && /bin/rm -rf  ~/.trash/${OPTARG}         exit -1                fi     ;;    l)        list       exit -1       ;;    s)        list       if [[ ${OPTARG} -eq "all" ]];then         save       else         read -p "确定要恢复这个${OPTARG}文件到~/tmp下吗?[y/n y]" confism         [[ $confism == "y" ]] || [[ $confism == "Y" ]] || [[ $confism == "yes" ]] && mv  ~/.trash/${OPTARG} ~/tmp/$(echo ${OPTARG}|awk -F. '{print $NR }')         exit -1       fi     ;;    ?)        echo "Invalid option: -$OPTARG" >&2       usage;;    :) usage;;    *) usage;;  esac      echo $option ,$OPTARGdone



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有